<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  
  <title>DRDS结合Mybatis解决方案与规范 | HankChan&#39;s Blog</title>
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
  <meta name="description" content="为了方便，在正文之前先附上初稿的PDF文件下载链接DRDS结合Mybatis解决方案与规范 可以在线阅读。1.DRDS的Mybatis解决方案与规范在运用DRDS分布式数据库时，考虑到使用DRUID数据库连接池技术，在配合使用Mybatis持久化框架的时候，采用Mybatis整合Spring，配置Mapper包扫描器的方式进行开发。 Mybatis使用范例见：swif-dao-drds项目的Sco">
<meta property="og:type" content="article">
<meta property="og:title" content="DRDS结合Mybatis解决方案与规范">
<meta property="og:url" content="http://hexo.hankchan.cn/2017/01/20/drds-e7-bb-93-e5-90-88mybatis-e8-a7-a3-e5-86-b3-e6-96-b9-e6-a1-88-e4-b8-8e-e8-a7-84-e8-8c-83/index.html">
<meta property="og:site_name" content="HankChan&#39;s Blog">
<meta property="og:description" content="为了方便，在正文之前先附上初稿的PDF文件下载链接DRDS结合Mybatis解决方案与规范 可以在线阅读。1.DRDS的Mybatis解决方案与规范在运用DRDS分布式数据库时，考虑到使用DRUID数据库连接池技术，在配合使用Mybatis持久化框架的时候，采用Mybatis整合Spring，配置Mapper包扫描器的方式进行开发。 Mybatis使用范例见：swif-dao-drds项目的Sco">
<meta property="og:updated_time" content="2017-05-26T02:13:23.615Z">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="DRDS结合Mybatis解决方案与规范">
<meta name="twitter:description" content="为了方便，在正文之前先附上初稿的PDF文件下载链接DRDS结合Mybatis解决方案与规范 可以在线阅读。1.DRDS的Mybatis解决方案与规范在运用DRDS分布式数据库时，考虑到使用DRUID数据库连接池技术，在配合使用Mybatis持久化框架的时候，采用Mybatis整合Spring，配置Mapper包扫描器的方式进行开发。 Mybatis使用范例见：swif-dao-drds项目的Sco">
  
    <link rel="alternate" href="/atom.xml" title="HankChan&#39;s Blog" type="application/atom+xml">
  
  
    <link rel="icon" href="/favicon.png">
  
  
    <link href="//fonts.googleapis.com/css?family=Source+Code+Pro" rel="stylesheet" type="text/css">
  
  <link rel="stylesheet" href="/css/style.css">
  

</head>

<body>
  <div id="container">
    <div id="wrap">
      <header id="header">
  <div id="banner"></div>
  <div id="header-outer" class="outer">
    <div id="header-title" class="inner">
      <h1 id="logo-wrap">
        <a href="/" id="logo">HankChan&#39;s Blog</a>
      </h1>
      
        <h2 id="subtitle-wrap">
          <a href="/" id="subtitle">生活就像海洋</a>
        </h2>
      
    </div>
    <div id="header-inner" class="inner">
      <nav id="main-nav">
        <a id="main-nav-toggle" class="nav-icon"></a>
        
          <a class="main-nav-link" href="/">Home</a>
        
          <a class="main-nav-link" href="/archives">Archives</a>
        
      </nav>
      <nav id="sub-nav">
        
          <a id="nav-rss-link" class="nav-icon" href="/atom.xml" title="RSS Feed"></a>
        
        <a id="nav-search-btn" class="nav-icon" title="搜索"></a>
      </nav>
      <div id="search-form-wrap">
        <form action="//google.com/search" method="get" accept-charset="UTF-8" class="search-form"><input type="search" name="q" class="search-form-input" placeholder="Search"><button type="submit" class="search-form-submit">&#xF002;</button><input type="hidden" name="sitesearch" value="http://hexo.hankchan.cn"></form>
      </div>
    </div>
  </div>
</header>
      <div class="outer">
        <section id="main"><article id="post-drds-e7-bb-93-e5-90-88mybatis-e8-a7-a3-e5-86-b3-e6-96-b9-e6-a1-88-e4-b8-8e-e8-a7-84-e8-8c-83" class="article article-type-post" itemscope itemprop="blogPost">
  <div class="article-meta">
    <a href="/2017/01/20/drds-e7-bb-93-e5-90-88mybatis-e8-a7-a3-e5-86-b3-e6-96-b9-e6-a1-88-e4-b8-8e-e8-a7-84-e8-8c-83/" class="article-date">
  <time datetime="2017-01-20T12:52:25.000Z" itemprop="datePublished">2017-01-20</time>
</a>
    
  <div class="article-category">
    <a class="article-category-link" href="/categories/未分类/">未分类</a>
  </div>

  </div>
  <div class="article-inner">
    
    
      <header class="article-header">
        
  
    <h1 class="article-title" itemprop="name">
      DRDS结合Mybatis解决方案与规范
    </h1>
  

      </header>
    
    <div class="article-entry" itemprop="articleBody">
      
        <h3 id="为了方便，在正文之前先附上初稿的PDF文件下载链接DRDS结合Mybatis解决方案与规范-可以在线阅读。"><a href="#为了方便，在正文之前先附上初稿的PDF文件下载链接DRDS结合Mybatis解决方案与规范-可以在线阅读。" class="headerlink" title="为了方便，在正文之前先附上初稿的PDF文件下载链接DRDS结合Mybatis解决方案与规范 可以在线阅读。"></a>为了方便，在正文之前先附上初稿的PDF文件下载链接<a href="http://blog.hankchan.cn/wp-content/uploads/2017/03/DRDS结合Mybatis解决方案与规范.pdf" target="_blank" rel="external">DRDS结合Mybatis解决方案与规范</a> 可以在线阅读。</h3><h1 id="1-DRDS的Mybatis解决方案与规范"><a href="#1-DRDS的Mybatis解决方案与规范" class="headerlink" title="1.DRDS的Mybatis解决方案与规范"></a><strong><strong>1.DRDS的Mybatis解决方案与规范</strong></strong></h1><p>在运用DRDS分布式数据库时，考虑到使用DRUID数据库连接池技术，在配合使用Mybatis持久化框架的时候，采用Mybatis整合Spring，配置Mapper包扫描器的方式进行开发。</p>
<p>Mybatis使用范例见：swif-dao-drds项目的ScoreDemo相关的实体类、Mapper接口类和MapperXML文件。</p>
<h2 id="1-1-Mybatis整合Spring"><a href="#1-1-Mybatis整合Spring" class="headerlink" title="1.1. **Mybatis整合Spring**"></a><strong>1.1. <em>**</em></strong>Mybatis整合Spring<em>**</em></h2><p>配Mybatis整合Spring的主要工作包括：添加项目依赖，在Spring配置文件中配置管理Mybatis需要的Bean。完成这两部分工作即可。</p>
<h3 id="1-1-1-添加项目依赖"><a href="#1-1-1-添加项目依赖" class="headerlink" title="1.1.1. **添加项目依赖**"></a><strong>1.1.1. <em>**</em></strong>添加项目依赖<em>**</em></h3><p>在已有的Spring基础环境的基础上，为了整合Mybatis，首先需要加入相关的依赖包，包括：mybatis核心包，spring-mybatis整合包。</p>
<h3 id="1-1-2-配置Mybatis的Bean"><a href="#1-1-2-配置Mybatis的Bean" class="headerlink" title="1.1.2. **配置Mybatis的Bean**"></a><strong>1.1.2. <em>**</em></strong>配置Mybatis的Bean<em>**</em></h3><p>Mybatis框架的核心是SqlSessionFactory，我们将SqlSessionFactory交给Spring管理，通过依赖注入方式来使用它。为了统一管理，我们创建一个Spring的配置文件：application-mybatis.xml用于管理Mybatis相关的Bean。</p>
<h4 id="1-1-2-1-SqlSessionFactory"><a href="#1-1-2-1-SqlSessionFactory" class="headerlink" title="1.1.2.1. **SqlSessionFactory**"></a><strong>1.1.2.1. <em>**</em></strong>SqlSessionFactory<em>**</em></h4><p>我们在配置SqlSessionFactory的时候，需要配置两个属性，一个是数据源DataSource，由于使用了DRUID数据库连接池，所以dataSource就是DRUID（前面关于DRDS配置中已经进行了说明）；另一个是configLocation，用于加载Mybatis的全局配置文件的属性。实际配置信息如下图：</p>
<h4 id="1-1-2-2-MapperScannerConfigurer"><a href="#1-1-2-2-MapperScannerConfigurer" class="headerlink" title="1.1.2.2. **MapperScannerConfigurer**"></a><strong>1.1.2.2. <em>**</em></strong>MapperScannerConfigurer<em>**</em></h4><p>MapperScannerConfigurer是Mybatis用于自动扫描MapperXML文件的扫描器类，它可以自动将指定包路径下MapperXML中的MapperStatement和Mapper接口纳入Mybatis的管理中。</p>
<p>需要配置的属性是：包路径basePackage，用于指定被扫描的包含MapperXML和Mapper接口类的包路径，当需要多个包时，使用英文逗号分隔。另一个是SqlSessionFactoryBeanName，用于注入SqlSessionFactory。具体配置情况如下图：</p>
<h4 id="1-1-2-3-DataSourceTransactionManager"><a href="#1-1-2-3-DataSourceTransactionManager" class="headerlink" title="1.1.2.3. **DataSourceTransactionManager**"></a><strong>1.1.2.3. <em>**</em></strong>DataSourceTransactionManager<em>**</em></h4><p>dataSourceTransactionManager是Mybatis的事务管理器，只需要配置dataSource数据源一个属性即可，如下图所示：</p>
<h2 id="1-2-Mybatis全局配置文件"><a href="#1-2-Mybatis全局配置文件" class="headerlink" title="1.2. **Mybatis全局配置文件**"></a><strong>1.2. <em>**</em></strong>Mybatis全局配置文件<em>**</em></h2><p>在使用Mybatis过程中，相关的全局配置信息可以交给Mybatis的全局配置文件进行管理。我们将该全局配置文件命名为：mybatis.xml，并且放在classpath路径下。</p>
<h3 id="1-2-1-全局配置文件的结构"><a href="#1-2-1-全局配置文件的结构" class="headerlink" title="1.2.1. **全局配置文件的结构**"></a><strong>1.2.1. <em>**</em></strong>全局配置文件的结构<em>**</em></h3><p>MyBatis 的 XML 配置文件包含了影响 MyBatis 的设置和属性信息。XML 文档的高层级结构如下图：</p>
<p>其中的环境配置和映射器配置不需要进一步配置，这是因为在Mybatis整合Spring的时候已经通过Spring配置管理。</p>
<p>configuration配置可以用于配置一些全局的配置信息，常用的有Settings设置、TypeAliases类型别名等。</p>
<h4 id="1-2-1-1-Settings"><a href="#1-2-1-1-Settings" class="headerlink" title="1.2.1.1. **Settings**"></a><strong>1.2.1.1. <em>**</em></strong>Settings<em>**</em></h4><p>Settings可以用于管理Mybatis的缓存、超时时间等信息。对此暂时不需要做进一步配置，可以忽略。</p>
<h4 id="1-2-1-2-TypeAliases"><a href="#1-2-1-2-TypeAliases" class="headerlink" title="1.2.1.2. **TypeAliases**"></a><strong>1.2.1.2. <em>**</em></strong>TypeAliases<em>**</em></h4><p>类型别名是为Java类型命名一个短的名字。它只和MapperXML配置有关，只用来减少类完全限定名的多余部分，比如：</p>
<p>如此一来在MapperXML配置文件中编写SQL Statement语句的resultType、parameterType设置相应的Java类的时候就可以不需要写全类名，简化开发。比如：</p>
<p>需要注意的是在配置的时候不要同resultMap属性混淆，resultMap是在MapperXML文件中定义的。</p>
<p>下面是一些Mybatis定义好的Java类及其对应的别名，可以直接使用。</p>
<table><br><tbody><br><tr><br><td width="181">别名</td><br><td width="238">映射的类型</td><br></tr><br><tr><br><td width="181">_byte</td><br><td width="238">byte</td><br></tr><br><tr><br><td width="181">_long</td><br><td width="238">long</td><br></tr><br><tr><br><td width="181">_short</td><br><td width="238">short</td><br></tr><br><tr><br><td width="181">_int</td><br><td width="238">int</td><br></tr><br><tr><br><td width="181">_integer</td><br><td width="238">int</td><br></tr><br><tr><br><td width="181">_double</td><br><td width="238">double</td><br></tr><br><tr><br><td width="181">_float</td><br><td width="238">float</td><br></tr><br><tr><br><td width="181">_boolean</td><br><td width="238">boolean</td><br></tr><br><tr><br><td width="181">string</td><br><td width="238">String</td><br></tr><br><tr><br><td width="181">byte</td><br><td width="238">Byte</td><br></tr><br><tr><br><td width="181">long</td><br><td width="238">Long</td><br></tr><br><tr><br><td width="181">short</td><br><td width="238">Short</td><br></tr><br><tr><br><td width="181">int</td><br><td width="238">Integer</td><br></tr><br><tr><br><td width="181">integer</td><br><td width="238">Integer</td><br></tr><br><tr><br><td width="181">double</td><br><td width="238">Double</td><br></tr><br><tr><br><td width="181">float</td><br><td width="238">Float</td><br></tr><br><tr><br><td width="181">boolean</td><br><td width="238">Boolean</td><br></tr><br><tr><br><td width="181">date</td><br><td width="238">Date</td><br></tr><br><tr><br><td width="181">decimal</td><br><td width="238">BigDecimal</td><br></tr><br><tr><br><td width="181">bigdecimal</td><br><td width="238">BigDecimal</td><br></tr><br><tr><br><td width="181">object</td><br><td width="238">Object</td><br></tr><br><tr><br><td width="181">map</td><br><td width="238">Map</td><br></tr><br><tr><br><td width="181">hashmap</td><br><td width="238">HashMap</td><br></tr><br><tr><br><td width="181">list</td><br><td width="238">List</td><br></tr><br><tr><br><td width="181">arraylist</td><br><td width="238">ArrayList</td><br></tr><br><tr><br><td width="181">collection</td><br><td width="238">Collection</td><br></tr><br><tr><br><td width="181">iterator</td><br><td width="238">Iterator</td><br></tr><br></tbody><br></table>

<h4 id="1-2-1-3-Mybatis全局配置文件示例"><a href="#1-2-1-3-Mybatis全局配置文件示例" class="headerlink" title="1.2.1.3. **Mybatis全局配置文件示例**"></a><strong>1.2.1.3. <em>**</em></strong>Mybatis全局配置文件示例<em>**</em></h4><p>Mybatis全局配置文件本质上是一个XML文件，需要在文件头添加相应的信息。示例如下：</p>
<h2 id="1-3-接入DRUID数据源"><a href="#1-3-接入DRUID数据源" class="headerlink" title="1.3. **接入DRUID数据源**"></a><strong>1.3. <em>**</em></strong>接入DRUID数据源<em>**</em></h2><p>在前面接入DRDS中已经提到了关于配置DURID连接池的说明，也就是通过Spring管理DRUID的Bean。</p>
<h2 id="1-4-规定一些开发规范"><a href="#1-4-规定一些开发规范" class="headerlink" title="1.4. **规定一些开发规范**"></a><strong>1.4. <em>**</em></strong>规定一些开发规范<em>**</em></h2><p>这部分开发规范包括了Mybatis定义的、根据实际开发情况自定义的规范。遵循这样一套规范更有利于开发维护工作。</p>
<p>更多的规范还要进一步补充，可以根据实际应用的需要作进一步的调整。</p>
<h3 id="1-4-1-关于包名"><a href="#1-4-1-关于包名" class="headerlink" title="1.4.1. **关于包名**"></a><strong>1.4.1. <em>**</em></strong>关于包名<em>**</em></h3><h4 id="1-4-1-1-实体类包名"><a href="#1-4-1-1-实体类包名" class="headerlink" title="1.4.1.1. **实体类包名**"></a><strong>1.4.1.1. <em>**</em></strong>实体类包名<em>**</em></h4><p>实体类包主要用于存放实体类。</p>
<p>实体类的规范主要集中在统一类型的包命名上。我们定义形如：xxx.yyy.entity的包用于存放相关的实体类，并且仅仅用于存放实体类。</p>
<h4 id="1-4-1-2-Mapper包名"><a href="#1-4-1-2-Mapper包名" class="headerlink" title="1.4.1.2. **Mapper包名**"></a><strong>1.4.1.2. <em>**</em></strong>Mapper包名<em>**</em></h4><p>Mapper包名都需要统一纳入MapperScannerConfigurer的Bean的管理。</p>
<p>Mapper包统一规定用于存放Mapper接口类和Mapper接口类对应的MapperXML文件。</p>
<p>并且我们规定，每个Mapper包的命名方式向其对应的实体类包相近，就是说它们唯一同一个上级包下的不同包，如实体类包名为：xxx.yyy.entity，那么Mapper包名则是形如：xxx.yyy.mapper的格式。</p>
<h3 id="1-4-2-关于MapperXML和Mapper接口类命名"><a href="#1-4-2-关于MapperXML和Mapper接口类命名" class="headerlink" title="1.4.2. **关于MapperXML和Mapper接口类命名**"></a><strong>1.4.2. <em>**</em></strong>关于MapperXML和Mapper接口类命名<em>**</em></h3><h4 id="1-4-2-1-MapperXML文件名和Mapper类名"><a href="#1-4-2-1-MapperXML文件名和Mapper类名" class="headerlink" title="1.4.2.1. **MapperXML文件名和Mapper类名**"></a><strong>1.4.2.1. <em>**</em></strong>MapperXML文件名和Mapper类名<em>**</em></h4><p>按照Mybatis的约定，当实体类名为Xxxx.java的时候，其对应的Mapper接口类名为：XxxxMapper.java；其对应的MapperXML文件名为：XxxxMapper.xml。</p>
<h4 id="1-4-2-2-命名空间命名"><a href="#1-4-2-2-命名空间命名" class="headerlink" title="1.4.2.2. **命名空间命名**"></a><strong>1.4.2.2. <em>**</em></strong>命名空间命名<em>**</em></h4><p>在MapperXML中，命名空间namespace是唯一的，我们使用该MapperXML相对应的Mapper接口类全类名作为命名空间。</p>
<h3 id="1-4-3-关于Mapper接口类的方法的传入参数"><a href="#1-4-3-关于Mapper接口类的方法的传入参数" class="headerlink" title="1.4.3. **关于Mapper接口类的方法的传入参数**"></a><strong>1.4.3. <em>**</em></strong>关于Mapper接口类的方法的传入参数<em>**</em></h3><h4 id="1-4-3-1-自定义Criteria类的使用"><a href="#1-4-3-1-自定义Criteria类的使用" class="headerlink" title="1.4.3.1. **自定义Criteria类的使用**"></a><strong>1.4.3.1. <em>**</em></strong>自定义Criteria类的使用<em>**</em></h4><p>我们使用了自定义的一个传入参数信息类Criteria.java来接收SQL的传入参数信息。本质上，Criteria是一个映射集合Map，通过继承了HashMap类同时自定义实现了许多实用的方法用于设置传入参数。</p>
<p>在使用Mybatis过程中，传入参数除了简单类型和普通Java类以外，将Criteria规定为唯一的合法传入参数信息类。当需要使用Map、List或者更加复杂的传入参数时，都通过Criteria类来进行设置。</p>
<p>允许使用多个Criteria作为传入参数，我们通过Mybatis提供的注解@Param(“VALUE”)来修饰Criteria参数。使得MapperStatement语句可以对多个Criteria参数进行区别处理。</p>
<h5 id="1-4-3-1-1-接口方法示例"><a href="#1-4-3-1-1-接口方法示例" class="headerlink" title="1.4.3.1.1. **接口方法示例**"></a><strong>1.4.3.1.1. <em>**</em></strong>接口方法示例<em>**</em></h5><p>示例如下图：</p>
<h5 id="1-4-3-1-2-MapperXML示例"><a href="#1-4-3-1-2-MapperXML示例" class="headerlink" title="1.4.3.1.2. **MapperXML示例**"></a><strong>1.4.3.1.2. <em>**</em></strong>MapperXML示例<em>**</em></h5><p>如此一来，就可以在MapperXML中通过占位符#{aaa.bbb}或${aaa.bbb}方式进行参数匹配。示例如下图：</p>
<h4 id="1-4-3-2-封装对象类JavaBean的使用"><a href="#1-4-3-2-封装对象类JavaBean的使用" class="headerlink" title="1.4.3.2. **封装对象类JavaBean的使用**"></a><strong>1.4.3.2. <em>**</em></strong>封装对象类JavaBean的使用<em>**</em></h4><p>我们根据业务需求，除了使用自定义的Criteria类之外，定义了封装输入参数信息的JavaBean对象。直接将对象作为输入参数，由Mybatis的OGNL支持可以自动映射相应的参数占位符。</p>
<p>为了便于区别输入参数信息类和数据表实体类的区别，我们统一规定其命名方式为：“实体类名+”Example””作为输入参数信息类的类名。如下图Mapper接口类方法中的例子：</p>
<h5 id="1-4-3-2-1-接口示例方法"><a href="#1-4-3-2-1-接口示例方法" class="headerlink" title="1.4.3.2.1. **接口示例方法**"></a><strong>1.4.3.2.1. <em>**</em></strong>接口示例方法<em>**</em></h5><p>如下图所示，通过@Param注解修饰让该对象等同于使用Criteria自定义类，不同在于，Mybatis映射Criteria（本质上是一个HashMap）是通过映射该自定义的Key去寻找相应的Value，而对于JavaBean对象，Mybatis则是通过SetterGetter方法去查找相应的值。</p>
<h5 id="1-4-3-2-2-MapperXML示例"><a href="#1-4-3-2-2-MapperXML示例" class="headerlink" title="1.4.3.2.2. **MapperXML示例**"></a><strong>1.4.3.2.2. <em>**</em></strong>MapperXML示例<em>**</em></h5><p>由于Mybatis对OGNL的支持，配合@Param注解，对于JavaBean的输入参数，MapperXML中的定义可以更加简单，如下图：</p>
<p>可以看到，输入参数parameterType都可以直接省略不写。</p>
<h3 id="1-4-4-关于占位符、元素Id的命名"><a href="#1-4-4-关于占位符、元素Id的命名" class="headerlink" title="1.4.4. **关于占位符、元素Id的命名**"></a><strong>1.4.4. <em>**</em></strong>关于占位符、元素Id的命名<em>**</em></h3><p>由于Mybatis的属性占位符支持OGNL，所以可以通过英文句点“.”的方式映射Java Bean对象或者Map的key的对应值。如：#{criteria.location.province}，${criteria.location.province}等。</p>
<h4 id="1-4-4-1-在XML中设定值的占位符的命名"><a href="#1-4-4-1-在XML中设定值的占位符的命名" class="headerlink" title="1.4.4.1. **在XML中设定值的占位符的命名**"></a><strong>1.4.4.1. <em>**</em></strong>在XML中设定值的占位符的命名<em>**</em></h4><p>由于SQL片段中的占位符可以直接在引用在片段的时候定义值，于是我们统一规定，这一类在引用的时候才定义的占位符统一使用下划线开头的命名方式，形如：_scoreFunction。</p>
<p>以下为示例：</p>
<p>被引用的片段如下：</p>
<p>引用SQL的语句定义如下：</p>
<p>有一点需要注意的是，在定义占位符属性值的时候，存在一个值的作用域的问题。比如说在嵌套引用的关系中，都对同一个占位符${..}赋值。</p>
<p>这个时候，Mybatis将会按照就近原则，从最近的嵌套元素中匹配相应的值，如下图所示，同一个属性设置两次，起作用的将会是由红色下划线标识的部分。</p>
<p>由此，我们也规定：对于这类属性占位符的赋值，尽可能在嵌套引用的最外层处理，最理想的状态是在&lt;select&gt;等MapperStatement中在进行赋值，这样的SQL片段更加有利于提高重用性。具体应用场景需要根据该占位符的作用来灵活地选择方案。</p>
<h4 id="1-4-4-2-输入参数占位符命名"><a href="#1-4-4-2-输入参数占位符命名" class="headerlink" title="1.4.4.2. **输入参数占位符命名**"></a><strong>1.4.4.2. <em>**</em></strong>输入参数占位符命名<em>**</em></h4><p>我们统一规定，采用驼峰式方式为属性占位符命名，即：以字母开头，并且首个单词首字母小写其他单词首字母大写的方式，如：#{departmentId}或${departmentId}。</p>
<p>对于复杂的属性映射，在每个占位符中使用英文句点分隔，命名方式不因存在该句点而变化，如：#{criteria.departmentId}或${criteria.departmentId}。</p>
<h4 id="1-4-4-3-lt-sql-gt-元素Id的命名"><a href="#1-4-4-3-lt-sql-gt-元素Id的命名" class="headerlink" title="1.4.4.3. **&lt;sql&gt;元素Id的命名**"></a><strong>1.4.4.3. <em>**</em></strong>&lt;sql&gt;元素Id的命名<em>**</em></h4><p>为了增加辨识度，我们统一规定，所有的&lt;sql&gt;元素的Id命名均采用以下划线分隔、首字符大写的命名方式。如：</p>
<p>当该条SQL包含较为完整的SELECT/UPDATE、FROM、WHERE等要素以致足以构成一条可用SQL的时候，就用“_SQL”作为元素Id的结尾。如：</p>
<h4 id="1-4-4-4-MapperStatement的Id的命名"><a href="#1-4-4-4-MapperStatement的Id的命名" class="headerlink" title="1.4.4.4. **MapperStatement的Id的命名**"></a><strong>1.4.4.4. <em>**</em></strong>MapperStatement的Id的命名<em>**</em></h4><p>MapperStatement就是Mybatis生成的用于执行的SQL语句所在的元素节点。也就是&lt;select&gt;,&lt;update&gt;,&lt;delete&gt;,&lt;insert&gt;元素的内容。其Id值就是对应的MapperStatement的Id。</p>
<p>按照规定，每一条MapperStatement的Id都在对应的Mapper接口类中有相应的同名方法。</p>
<p>所以我们在命名MapperStatement的时候，同样规定采用驼峰式的命名方式。</p>
<p>值得注意的是，我们可以在Mapper接口类中重载这些方法，Mybatis只要形参中定义的输入参数最终能够匹配该MapperStatement中所需要的属性占位符即可。例子如下：</p>
<h3 id="1-4-5-关于SqlSessionFactory的使用"><a href="#1-4-5-关于SqlSessionFactory的使用" class="headerlink" title="1.4.5. **关于SqlSessionFactory的使用**"></a><strong>1.4.5. <em>**</em></strong>关于SqlSessionFactory的使用<em>**</em></h3><h4 id="1-4-5-1-注入SqlSessionFactory依赖"><a href="#1-4-5-1-注入SqlSessionFactory依赖" class="headerlink" title="1.4.5.1. **注入SqlSessionFactory依赖**"></a><strong>1.4.5.1. <em>**</em></strong>注入SqlSessionFactory依赖<em>**</em></h4><p>在开发DAO层的时候，主要是通过使用SqlSessionFactory来创建SqlSession，再由SqlSession去完成数据库相关的操作。对于SqlSessionFactory的使用，主要推荐两种使用方式。</p>
<p>其一：通过Setter注入方式将其作为数据库操作基类的一个属性，如下图所示：</p>
<p>其二：通过注解方式依赖注入，如下图所示：</p>
<p>两者相比较而言，Setter注入方式需要在依赖SqlSessionFactory的类中配置sqlSessionFactory的属性，而注解方式不需要。但是从单元测试角度而言，Setter注入方式更加方便。</p>
<h4 id="1-4-5-2-SqlSession的使用"><a href="#1-4-5-2-SqlSession的使用" class="headerlink" title="1.4.5.2. **SqlSession的使用**"></a><strong>1.4.5.2. <em>**</em></strong>SqlSession的使用<em>**</em></h4><p>我们已经知道，操作Mybatis执行SQL语句的关键是通过SqlSession。在这里，关于SqlSession的使用主要有以下几点需要特别注意：</p>
<ol>
<li><p>SqlSession的作用域必须控制在一个方法内而不是类的全局。如下图：</p>
</li>
<li><p>SqlSession是通过sqlSessionFactory.openSession(<strong><strong>boolean</strong></strong>autoCommit)创建的，当形参为空时默认是false，但是当需要操作的SQL涉及数据的变化时，就需要显性地将形参设置为true。</p>
</li>
<li>建议使用：<br><strong><strong>  <em>**</em></strong></strong>try<strong><strong>(SqlSession sqlSession = sqlSessionFactory.openSession()) { //</strong></strong>coding here <em>**</em>}</li>
</ol>
<p>的方式作为SqlSession的创建方式。</p>
<h2 id="1-5-MapperXML的基本使用"><a href="#1-5-MapperXML的基本使用" class="headerlink" title="1.5. **MapperXML的基本使用**"></a><strong>1.5. <em>**</em></strong>MapperXML的基本使用<em>**</em></h2><p>建议查看swift-dao-drds中的范例（ScoreDemoMapper.xml文件）的使用。</p>
<h3 id="1-5-1-select"><a href="#1-5-1-select" class="headerlink" title="1.5.1. **select**"></a><strong>1.5.1. <em>**</em></strong>select<em>**</em></h3><p>如下图示例，这是最基础的一条SELECT查询语句，该语句id为”get”，需要跟Mapper接口类的一个方法名相同。输入参数parameterType为”GuandSurfH”，这里再次强调parameterType、resultType的值是在全局配置文件中定义的别名。而返回结果集的”GuandSurfH”，则是在MapperXML文件中定义的。</p>
<p><strong><strong>参数占位符说明</strong></strong></p>
<p>#{ObserveTime}</p>
<p>这就告诉MyBatis创建一个PreparedStatement（预处理语句）参数。使用JDBC，这样的一个参数在SQL中会由一个“?”来标识，并被传递到一个新的预处理语句中。</p>
<p>${_timeSuffix}</p>
<p>这是一个拼接字符串占位符，其参数会直接作为一个字符串拼接到SQL语句中去。</p>
<p>就像下面这样：</p>
<p>// 相似的JDBC代码</p>
<p>String get=”SELECT * FROM t_guand_surf_h201610 WHERE ObserveTime=? AND StationID=?”;</p>
<p>PreparedStatement ps = conn.prepareStatement(get);</p>
<p>// ……</p>
<h3 id="1-5-2-insert、update、delete"><a href="#1-5-2-insert、update、delete" class="headerlink" title="1.5.2. **insert、update、delete**"></a><strong>1.5.2. <em>**</em></strong>insert、update、delete<em>**</em></h3><p>数据修改语句 insert，update 和 delete 在它们的实现中非常相似。</p>
<h3 id="1-5-3-sql"><a href="#1-5-3-sql" class="headerlink" title="1.5.3. **sql**"></a><strong>1.5.3. <em>**</em></strong>sql<em>**</em></h3><p>sql这个元素可以被用来定义可重用的SQL代码段，可以包含在其他语句中。如下图示例：</p>
<p>在定义好sql元素的片段之后，可以在MapperXML范围内引用该SQL片段，方法是使用include元素，如下图：</p>
<p>该元素的内容将作为一个完整的语句片段被包含在其他的语句中，并且支持sql元素的嵌套引用。可以结合foreach元素设计开发复杂的动态SQL语句，如多表UNION、JOIN查询等。</p>
<h3 id="1-5-4-resultMap"><a href="#1-5-4-resultMap" class="headerlink" title="1.5.4. **resultMap**"></a><strong>1.5.4. <em>**</em></strong>resultMap<em>**</em></h3><p>resultMap是定义在MapperXML文件中的用于映射SQL返回结果的自定义集合。可以根据需求自定义查询结果集中的列名与JavaBean实体类的映射关系。</p>
<h2 id="1-6-一些开发维护的建议"><a href="#1-6-一些开发维护的建议" class="headerlink" title="1.6. **一些开发维护的建议**"></a><strong>1.6. <em>**</em></strong>一些开发维护的建议<em>**</em></h2><p>为了应对多变的需求的开发维护，总结一些开发新功能、维护改进旧功能的小技巧。这是建立在基础环境搭建完成的前提下的。提供了一些简单的开发步骤说明，更复杂的场景还需要进一步思考选择，不必拘泥。</p>
<h3 id="1-6-1-开发新需求"><a href="#1-6-1-开发新需求" class="headerlink" title="1.6.1. **开发新需求**"></a><strong>1.6.1. <em>**</em></strong>开发新需求<em>**</em></h3><p>开发新需求主要指的是，需要重新开始一个子模块功能（诸如：station、typhoon、score都单独认为是一个子模块功能类）的开发。我们推荐按照以下大致步骤进行。</p>
<h4 id="1-6-1-1-创建实体类"><a href="#1-6-1-1-创建实体类" class="headerlink" title="1.6.1.1. **创建实体类**"></a><strong>1.6.1.1. <em>**</em></strong>创建实体类<em>**</em></h4><p>从数据库表作为出发点，首先创建命名新的包名用于存放数据表对应的实体类，然后根据数据表编写设计实体类。Setter和Getter方法是必不可少的。</p>
<h4 id="1-6-1-2-创建Mapper接口和MapperXML"><a href="#1-6-1-2-创建Mapper接口和MapperXML" class="headerlink" title="1.6.1.2. **创建Mapper接口和MapperXML**"></a><strong>1.6.1.2. <em>**</em></strong>创建Mapper接口和MapperXML<em>**</em></h4><p>首先根据前面提到的命名规范，创建Mapper的包用于存放Mapper接口和MapperXML文件。然后根据实体类的情况创建相应的XxxMapper接口类和XxxMapper.xml文件。</p>
<h4 id="1-6-1-3-加到Mybatis扫描器"><a href="#1-6-1-3-加到Mybatis扫描器" class="headerlink" title="1.6.1.3. **加到Mybatis扫描器**"></a><strong>1.6.1.3. <em>**</em></strong>加到Mybatis扫描器<em>**</em></h4><p>找到Mybatis相关的Spring的配置文件，找到Mybatis包扫描器MapperScannerConfigurer，在其属性basePackage值中加入新增的Mapper接口和MapperXML所在包的包名，多个包使用英文逗号分隔，如下图：</p>
<h4 id="1-6-1-4-编写MapperXML"><a href="#1-6-1-4-编写MapperXML" class="headerlink" title="1.6.1.4. **编写MapperXML**"></a><strong>1.6.1.4. <em>**</em></strong>编写MapperXML<em>**</em></h4><p>首先，每一个Mybatis的MapperXML文件都必须有以下的文档头：</p>
<p>接着，在根节点&lt;mapper&gt;中需要设置命名空间属性namespace，在命名方式规范中有提到。</p>
<p>然后，首先拿到需要运行的SQL语句，根据SQL语句返回结果集考虑如何选择定义ResultMap。</p>
<p>在ResultMap中，其type属性值建议仍然使用其对应的实体类的全类名，除非返回结果集在对应的实体类中已经无法适用，否则不建议重新创建定义新的实体类去接收返回结果对象。</p>
<p>如下图，需要返回的结果集不同，但是仍然可以基于相同的实体类，那些没有被映射的字段将会是默认值：</p>
<h3 id="1-6-2-维护原有业务"><a href="#1-6-2-维护原有业务" class="headerlink" title="1.6.2. **维护原有业务**"></a><strong>1.6.2. <em>**</em></strong>维护原有业务<em>**</em></h3><p>维护原有业务主要包括：在原有的基础上进行的功能修改、删减、增加等操作。而且是有SQL语句变化需求的操作。</p>
<p>具体说就是在SQL语句层面的维护，业务层的维护修改不涉及SQL语句故而不属于该范畴。这一部分需要功能需求入手，主要说明了需要注意的事项。</p>
<h4 id="1-6-2-1-功能修改、删减"><a href="#1-6-2-1-功能修改、删减" class="headerlink" title="1.6.2.1. **功能修改、删减**"></a><strong>1.6.2.1. <em>**</em></strong>功能修改、删减<em>**</em></h4><p>对于功能修改删减而言，我们可以从被调用的Mapper接口类的方法作为起点，在对应的MapperXML中找到与该方法名同名的MapperStatement，通过修改MapperStatement对功能进行修改。</p>
<p>如果MapperStatement中包含了引用语句，尽可能不要改动被引用的SQL片段，你不知道哪里还有引用，确实需要修改引用语句的，你也要确保所有引用该片段的语句功能变化是受你控制的。</p>
<p>建议是首先考虑新增一个SQL片段去适应新的功能需求，弃用原来引用的SQL片段。如果功能改动很大，请酌情选择涉及的相关引用了该SQL片段的语句。</p>
<h4 id="1-6-2-2-功能新增"><a href="#1-6-2-2-功能新增" class="headerlink" title="1.6.2.2. **功能新增**"></a><strong>1.6.2.2. <em>**</em></strong>功能新增<em>**</em></h4><p>功能新增主要场景有：当需要加入新的SQL语句或者需要在原有的SQL语句中加入某些查询列、查询条件、排序条件等内容。</p>
<p>对于加入新的SQL语句，可以直接创建一条新的SQL片段，查找原有的基础SQL片段中是否有可重用的，引入进来使用即可。</p>
<p>对于需要在原有SQL语句中加入一些列、条件的场景，主要有两种解决办法。</p>
<p>其一：在原有的SQL语句中，通过拼接字符串的占位符${…}，然后在引用该SQL的地方对这些占位符进行赋值（如加入列名、查询条件等）即可。</p>
<p>其二：重新创建新的SQL片段，更换原来的MapperStatement的引用。</p>
<p>可以根据应用场景灵活选择一种方案。</p>
<h2 id="1-7-可能遇到的问题"><a href="#1-7-可能遇到的问题" class="headerlink" title="1.7. **可能遇到的问题**"></a><strong>1.7. <em>**</em></strong>可能遇到的问题<em>**</em></h2><h3 id="1-7-1-集合类转换异常问题"><a href="#1-7-1-集合类转换异常问题" class="headerlink" title="1.7.1. **集合类转换异常问题**"></a><strong>1.7.1. <em>**</em></strong>集合类转换异常问题<em>**</em></h3><p><strong><strong>报错信息：</strong></strong></p>
<p>org.apache.ibatis.exceptions.PersistenceException:</p>
<h3 id="Error-querying-database-Cause-java-lang-IllegalArgumentException-invalid-comparison-java-util-Arrays-ArrayList-and-java-lang-String"><a href="#Error-querying-database-Cause-java-lang-IllegalArgumentException-invalid-comparison-java-util-Arrays-ArrayList-and-java-lang-String" class="headerlink" title="Error querying database.  Cause: java.lang.IllegalArgumentException: invalid comparison: java.util.Arrays$ArrayList and java.lang.String"></a>Error querying database.  Cause: java.lang.IllegalArgumentException: invalid comparison: java.util.Arrays$ArrayList and java.lang.String</h3><h3 id="Cause-java-lang-IllegalArgumentException-invalid-comparison-java-util-Arrays-ArrayList-and-java-lang-String"><a href="#Cause-java-lang-IllegalArgumentException-invalid-comparison-java-util-Arrays-ArrayList-and-java-lang-String" class="headerlink" title="Cause: java.lang.IllegalArgumentException: invalid comparison: java.util.Arrays$ArrayList and java.lang.String"></a>Cause: java.lang.IllegalArgumentException: invalid comparison: java.util.Arrays$ArrayList and java.lang.String</h3><p><strong><strong>说明：</strong></strong></p>
<p>在使用Mybatis编写MapperXML中，我们已经知道可以通过</p>
<p>的方式判断输入参数是否为null等。</p>
<p>但是如果被判断的是一个集合对象，当使用如上判断方式就会出错。因为集合无法判断是否不等于空字符串。当输入参数不是集合类，也就不存在该问题。</p>
<p><strong><strong>解决方法：</strong></strong></p>
<p>去掉判断语句中的集合不等于空字符串的判断即可。</p>
<h3 id="1-7-2-无法映射结果集问题"><a href="#1-7-2-无法映射结果集问题" class="headerlink" title="1.7.2. **无法映射结果集问题**"></a><strong>1.7.2. <em>**</em></strong>无法映射结果集问题<em>**</em></h3><p><strong><strong>报错信息：</strong></strong></p>
<p>org.apache.ibatis.exceptions.PersistenceException:</p>
<h3 id="Error-querying-database-Cause-org-apache-ibatis-executor-ExecutorException-A-query-was-run-and-no-Result-Maps-were-found-for-the-Mapped-Statement-‘swift-data-score-mapper-ScoreDemoMapper-getTsScoreProvinceStatisticor’-It’s-likely-that-neither-a-Result-Type-nor-a-Result-Map-was-specified"><a href="#Error-querying-database-Cause-org-apache-ibatis-executor-ExecutorException-A-query-was-run-and-no-Result-Maps-were-found-for-the-Mapped-Statement-‘swift-data-score-mapper-ScoreDemoMapper-getTsScoreProvinceStatisticor’-It’s-likely-that-neither-a-Result-Type-nor-a-Result-Map-was-specified" class="headerlink" title="Error querying database.  Cause: org.apache.ibatis.executor.ExecutorException: A query was run and no Result Maps were found for the Mapped Statement ‘swift.data.score.mapper.ScoreDemoMapper.getTsScoreProvinceStatisticor’.  It’s likely that neither a Result Type nor a Result Map was specified."></a>Error querying database.  Cause: org.apache.ibatis.executor.ExecutorException: A query was run and no Result Maps were found for the Mapped Statement ‘swift.data.score.mapper.ScoreDemoMapper.getTsScoreProvinceStatisticor’.  It’s likely that neither a Result Type nor a Result Map was specified.</h3><p><strong><strong>说明：</strong></strong></p>
<p>如果漏写了ResultType或者ResultMap（二者不可同时使用），将会出现该报错信息。</p>
<p><strong><strong>解决方法：</strong></strong></p>
<p>只需要在MapperStatement中补上ResultType或者ResultMap即可。</p>
<h3 id="1-7-3-多个参数映射失败问题"><a href="#1-7-3-多个参数映射失败问题" class="headerlink" title="1.7.3. **多个参数映射失败问题**"></a><strong>1.7.3. <em>**</em></strong>多个参数映射失败问题<em>**</em></h3><p><strong><strong>报错信息：</strong></strong></p>
<p>org.apache.ibatis.exceptions.PersistenceException:</p>
<h3 id="Error-querying-database-Cause-org-apache-ibatis-binding-BindingException-Parameter-‘criteria’-not-found-Available-parameters-are-1-jobType-param1-param2"><a href="#Error-querying-database-Cause-org-apache-ibatis-binding-BindingException-Parameter-‘criteria’-not-found-Available-parameters-are-1-jobType-param1-param2" class="headerlink" title="Error querying database.  Cause: org.apache.ibatis.binding.BindingException: Parameter ‘criteria’ not found. Available parameters are [1, jobType, param1, param2]"></a>Error querying database.  Cause: org.apache.ibatis.binding.BindingException: Parameter ‘criteria’ not found. Available parameters are [1, jobType, param1, param2]</h3><h3 id="Cause-org-apache-ibatis-binding-BindingException-Parameter-‘criteria’-not-found-Available-parameters-are-1-jobType-param1-param2"><a href="#Cause-org-apache-ibatis-binding-BindingException-Parameter-‘criteria’-not-found-Available-parameters-are-1-jobType-param1-param2" class="headerlink" title="Cause: org.apache.ibatis.binding.BindingException: Parameter ‘criteria’ not found. Available parameters are [1, jobType, param1, param2]"></a>Cause: org.apache.ibatis.binding.BindingException: Parameter ‘criteria’ not found. Available parameters are [1, jobType, param1, param2]</h3><p><strong><strong>说明：</strong></strong></p>
<p>当Mapper接口类中的方法是多个参数的时候，需要添加@Param注解修饰参数，因为Mybatis会默认以“param1, param2, …”的形式去解析输入参数，参数名并没有实际意义。</p>
<p>更简单的情况是，当只有一个输入参数时，类似的报错是值没有定义该Parameter。</p>
<p><strong><strong>解决方法：</strong></strong></p>
<p>为每个输入参数都用@Param注解定义其输入参数映射值Parameter即可避免该问题。或者检查提示的Parameter是否已经定义。</p>
<h3 id="1-7-4-符号格式错误问题"><a href="#1-7-4-符号格式错误问题" class="headerlink" title="1.7.4. **符号格式错误问题**"></a><strong>1.7.4. <em>**</em></strong>符号格式错误问题<em>**</em></h3><p><strong><strong>报错信息：</strong></strong></p>
<p>org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘scoreDemoMapper’ defined in file [D:\qxt\swift-edas-2\swift-dao-drds\target\classes\swift\data\score\mapper\ScoreDemoMapper.class]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: org.apache.ibatis.builder.BuilderException: Error creating document instance.  Cause: org.xml.sax.SAXParseException; lineNumber: 31; columnNumber: 22; 元素内容必须由格式正确的字符数据或标记组成。</p>
<p><strong><strong>说明：</strong></strong></p>
<p>这个报错信息指出XML格式错误，可能是某些节点没有闭合等，但是很大程度是因为使用了诸如“&lt;”、“&gt;”等影响XML解析的字符。</p>
<p><strong><strong>解决方法：</strong></strong></p>
<p>对这类型的字符需要使用格式转换符替换，如小于号“&lt;”使用“&lt;”代替，大于号“&gt;”使用“&gt;”代替。常见的几种替换符如下：</p>
<p><table></table></p>
<p><tbody></tbody></p>
<p><tr></tr></p>
<p><td width="104">&lt;</td></p>
<p><td width="86">&lt;</td></p>
<p><td width="91">小于</td><br></p>
<p><tr></tr></p>
<p><td width="104">&gt;</td></p>
<p><td width="86">&gt;</td></p>
<p><td width="91">大于</td><br></p>
<p><tr></tr></p>
<p><td width="104">&amp;</td></p>
<p><td width="86">&amp;</td></p>
<p><td width="91">和号</td><br></p>
<p><tr></tr></p>
<p><td width="104">‘</td></p>
<p><td width="86">‘</td></p>
<p><td width="91">省略号</td><br></p>
<p><tr></tr></p>
<p><td width="104">“</td></p>
<p><td width="86">“</td></p>
<p><td width="91">引号</td><br><br><br><br>还可以使用CDATA的形式替换特殊的字符，即使用：“&lt;![CDATA[”开始，由“]]&gt;” 结束的形式避免其中的内容被XML解析。如下图：</p>
<h1 id="2-附：MybatisGenerator的运用与否"><a href="#2-附：MybatisGenerator的运用与否" class="headerlink" title="2. **附：MybatisGenerator的运用与否**"></a><strong>2. <em>**</em></strong>附：MybatisGenerator的运用与否<em>**</em></h1><p>MybatisGenerator（以下简称：MBG）的使用主要有两步：配置配置文件、运行生成结果。</p>
<h2 id="2-1-运行生成"><a href="#2-1-运行生成" class="headerlink" title="2.1. **运行生成**"></a><strong>2.1. <em>**</em></strong>运行生成<em>**</em></h2><p>需要首先配置好相应的配置文件信息，才可以执行运行命令。由于配置文件信息内容较多，所以放在下一节进行说明。</p>
<p>通过Maven执行MybatisGenerator自动生成结果的命令如下：</p>
<p>mvn mybatis-generator:generate</p>
<h2 id="2-2-MybatisGenerator的配置"><a href="#2-2-MybatisGenerator的配置" class="headerlink" title="2.2. **MybatisGenerator的配置**"></a><strong>2.2. <em>**</em></strong>MybatisGenerator的配置<em>**</em></h2><p>使用默认的generatorConfig.xml文件名作为其配置信息文件。</p>
<p>详细配置信息参考Demo的generatorConfig.xml文件。下面只介绍几个重点且常用的配置说明。详细的配置信息说明可以参考官方文档：</p>
<p><a href="http://mbg.cndocs.tk/configreference/xmlconfig.html" target="_blank" rel="external"><u>http://mbg.cndocs.tk/configreference/xmlconfig.html</u></a></p>
<p>或者参考：</p>
<p><a href="http://www.jianshu.com/p/e09d2370b796" target="_blank" rel="external"><u>http://www.jianshu.com/p/e09d2370b796</u></a></p>
<p>用到的最多的配置主要有：数据库连接的jar包；数据库连接信息；生成的实体类信息；生成的Mapper类信息；生成的MapperXML信息；Java类解析器信息；自定义的目标数据库表的信息。</p>
<h3 id="2-2-1-数据库连接"><a href="#2-2-1-数据库连接" class="headerlink" title="2.2.1. **数据库连接**"></a><strong>2.2.1. <em>**</em></strong>数据库连接<em>**</em></h3><p>以使用MySQL数据库为例子，首先需要引入数据库连接的jar包，如下图所示：</p>
<p>然后在&lt;jdbcConnection&gt;元素节点下配置数据库连接的信息，包括驱动类、连接地址、用户名和密码等，如下图：</p>
<h3 id="2-2-2-目标实体类配置"><a href="#2-2-2-目标实体类配置" class="headerlink" title="2.2.2. **目标实体类配置**"></a><strong>2.2.2. <em>**</em></strong>目标实体类配置<em>**</em></h3><p>使用javaModelGenerator元素配置目标实体类的生成包信息，如下图所示：</p>
<p>配置数据库连接</p>
<p>配置生成的实体类</p>

      
    </div>
    <footer class="article-footer">
      <a data-url="http://hexo.hankchan.cn/2017/01/20/drds-e7-bb-93-e5-90-88mybatis-e8-a7-a3-e5-86-b3-e6-96-b9-e6-a1-88-e4-b8-8e-e8-a7-84-e8-8c-83/" data-id="cj359k3u70001fwv7brz8obrp" class="article-share-link">Share</a>
      
      
    </footer>
  </div>
  
    
<nav id="article-nav">
  
    <a href="/2017/03/13/docker-e5-be-ae-e6-9c-8d-e5-8a-a1-e5-ae-b9-e5-99-a8-e5-8c-96-e5-bc-80-e5-8f-91-e6-8e-a2-e7-b4-a2/" id="article-nav-newer" class="article-nav-link-wrap">
      <strong class="article-nav-caption">Newer</strong>
      <div class="article-nav-title">
        
          Docker-微服务容器化开发探索
        
      </div>
    </a>
  
  
    <a href="/2017/01/03/springmvc-thymeleaf-e5-bc-80-e5-8f-91-e6-8c-87-e5-8d-97-demo/" id="article-nav-older" class="article-nav-link-wrap">
      <strong class="article-nav-caption">Older</strong>
      <div class="article-nav-title">SpringMVC-Thymeleaf-开发指南-Demo</div>
    </a>
  
</nav>

  
</article>

</section>
        
          <aside id="sidebar">
  
    
  <div class="widget-wrap">
    <h3 class="widget-title">分类</h3>
    <div class="widget">
      <ul class="category-list"><li class="category-list-item"><a class="category-list-link" href="/categories/Docker/">Docker</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/Eclipse/">Eclipse</a><ul class="category-list-child"><li class="category-list-item"><a class="category-list-link" href="/categories/Eclipse/Mybatis/">Mybatis</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/Eclipse/Spring/">Spring</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/Eclipse/分布式/">分布式</a></li></ul></li><li class="category-list-item"><a class="category-list-link" href="/categories/Git/">Git</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/Linux/">Linux</a><ul class="category-list-child"><li class="category-list-item"><a class="category-list-link" href="/categories/Linux/Nginx/">Nginx</a></li></ul></li><li class="category-list-item"><a class="category-list-link" href="/categories/Mybatis/">Mybatis</a><ul class="category-list-child"><li class="category-list-item"><a class="category-list-link" href="/categories/Mybatis/Spring/">Spring</a><ul class="category-list-child"><li class="category-list-item"><a class="category-list-link" href="/categories/Mybatis/Spring/SpringMVC/">SpringMVC</a></li></ul></li><li class="category-list-item"><a class="category-list-link" href="/categories/Mybatis/SpringMVC/">SpringMVC</a></li></ul></li><li class="category-list-item"><a class="category-list-link" href="/categories/Nginx/">Nginx</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/Spring/">Spring</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/SpringMVC/">SpringMVC</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/分布式/">分布式</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/日志管理/">日志管理</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/未分类/">未分类</a></li></ul>
    </div>
  </div>


  
    

  
    
  
    
  <div class="widget-wrap">
    <h3 class="widget-title">归档</h3>
    <div class="widget">
      <ul class="archive-list"><li class="archive-list-item"><a class="archive-list-link" href="/archives/2017/03/">三月 2017</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2017/01/">一月 2017</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2016/10/">十月 2016</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2016/09/">九月 2016</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2016/08/">八月 2016</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2016/07/">七月 2016</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2016/06/">六月 2016</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2016/05/">五月 2016</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2016/04/">四月 2016</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2016/03/">三月 2016</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2016/02/">二月 2016</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2016/01/">一月 2016</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2015/12/">十二月 2015</a></li></ul>
    </div>
  </div>


  
    
  <div class="widget-wrap">
    <h3 class="widget-title">最新文章</h3>
    <div class="widget">
      <ul>
        
          <li>
            <a href="/2017/03/13/docker-e5-be-ae-e6-9c-8d-e5-8a-a1-e5-ae-b9-e5-99-a8-e5-8c-96-e5-bc-80-e5-8f-91-e6-8e-a2-e7-b4-a2/">Docker-微服务容器化开发探索</a>
          </li>
        
          <li>
            <a href="/2017/01/20/drds-e7-bb-93-e5-90-88mybatis-e8-a7-a3-e5-86-b3-e6-96-b9-e6-a1-88-e4-b8-8e-e8-a7-84-e8-8c-83/">DRDS结合Mybatis解决方案与规范</a>
          </li>
        
          <li>
            <a href="/2017/01/03/springmvc-thymeleaf-e5-bc-80-e5-8f-91-e6-8c-87-e5-8d-97-demo/">SpringMVC-Thymeleaf-开发指南-Demo</a>
          </li>
        
          <li>
            <a href="/2016/10/16/nginx-e4-bb-a3-e7-90-86-e6-9c-8d-e5-8a-a1-e5-99-a8-e6-96-b9-e5-bc-8f-e8-a7-a3-e5-86-b3-e5-ae-9e-e9-99-85-e5-bc-80-e5-8f-91-e4-b8-adajax-e8-af-b7-e6-b1-82-e7-9a-84-e8-b7-a8-e5-9f-9f-e9-97-ae-e9-a2-98/">Nginx代理服务器方式解决实际开发中Ajax请求的跨域问题</a>
          </li>
        
          <li>
            <a href="/2016/10/11/e5-b7-a5-e5-8e-82-e6-a8-a1-e5-bc-8f-e5-92-8c-e5-8d-95-e4-be-8b-e6-a8-a1-e5-bc-8f-e7-bb-93-e5-90-88-e5-ba-94-e7-94-a8-e7-9a-84-e5-9c-ba-e6-99-af-e6-80-9d-e8-80-83/">工厂模式和单例模式结合应用的场景思考</a>
          </li>
        
      </ul>
    </div>
  </div>

  
</aside>
        
      </div>
      <footer id="footer">
  
  <div class="outer">
    <div id="footer-info" class="inner">
      &copy; 2017 Hank Chan<br>
      Powered by <a href="http://hexo.io/" target="_blank">Hexo</a>
    </div>
  </div>
</footer>
    </div>
    <nav id="mobile-nav">
  
    <a href="/" class="mobile-nav-link">Home</a>
  
    <a href="/archives" class="mobile-nav-link">Archives</a>
  
</nav>
    

<script src="//ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script>


  <link rel="stylesheet" href="/fancybox/jquery.fancybox.css">
  <script src="/fancybox/jquery.fancybox.pack.js"></script>


<script src="/js/script.js"></script>

  </div>
</body>
</html>